
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http, { cors: true });

// 静态服务
// app.get('/socketClient', function (req, res) {
//     res.sendFile(__dirname + '/index.html');
// });
// 监听客户端




// 当前用户信息

let userDetail = {
    nick: '',
}

// 该聊天室在线人数
let roomMemmbers = []
function ChatRoom() {
    this.numbers = []
}
ChatRoom.prototype.addUser = function (user) {
    this.numbers.push(user)
    userDetail.nick = user
    roomMemmbers.push(user)
}
ChatRoom.prototype.delUser = function (user) {
    let index = this.numbers.findIndex((item) => {
        return item == user
    })
    this.numbers.splice(index, 1)
}
io.on('connection', function (socket) {

    let roomName; // 房间名
    /**
     * 1. 连接成功
     * 2. 新用户连接时，群发消息
     * */
    console.log('这里是服务端，我已接收到客户端的连接');

    let chatroom1 = new ChatRoom()
    /**
     * 监听用户端发送的消息
     * 1、获取用户昵称 nick
     * 2. 广播 新用户{{nickname}}的加入
     *  
     **/
    socket.on('addChat', function (nick) {
        io.emit('newUser', `欢迎新用户${nick}的加入！`)
        chatroom1.addUser(nick)
        console.log(chatroom1);
    })

    /**
     * 消息组成类
     * 
     * **/
    let sendMessage = function (data) {
        return {
            nick: data.nick,
            message: data.message
        }
    }


    /**
     * 群发消息, 包括发送方自己
     * 
     * */
    socket.on('sendMessageAll', function (data) {
        io.in(roomName).emit('MessageAll', sendMessage(data))
    })

    /**
     * 群发给他人消息，不包括自己
     * 
     * **/
    socket.on('sendMessageAllNoself', function (data) {
        socket.broadcast.emit('MessageAllNoself', sendMessage(data))
    })

    /**
     * 获取聊天室内用户全部列表  这里是 命名空间
      * 
     */
    socket.on('getRoomList', function () {
        io.emit('RoomList', {
            roomMemmbers
        })
    })

    /**
     * 进入房间
     * */ 
    socket.on('join', function(data) {
        //  join（） 
      roomName = data
      socket.join(data)
    })

    // 离开房间
    socket.on('leave', function(name) {
        // 离开房间是固定的， 表示离开某个房间
        socket.leave(name)

        roomName = ''
    })




    // 连接失败反馈
    socket.on('disconnect', function () {

        console.log('serve, ', 'user disconnected');
        io.emit('quitUser', `${userDetail.nick}有人退出聊天室！`)
    })

    //   
});




http.listen(3000, function () {
    console.log('listening on *:3000');
});